SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE [dbo].[paChequearIniciosDeLicenciasBK19052009]
-- <DESCRIPCION> Realiza el chequeo de concecion de una licencia.
-- <CONSIDERACIONES ESPECIALES> Licencias Extraordinarias, Licencias Historicas, Licencias Actuales.
-- <TABLAS> tb_ServiciosAgentes, tb_SubServiciosAgentes, tb_ColaDeMovimientos, tb_PlazasDeMovimiento, tb_Licencias, tb_Plazas
-- <PROCEDIMIENTOS> spDIFDiasHabiles, spAntiguedadAgenteHab, spAntiguedadAgente
-- <ACTUALIZACIONES> 24 - 03 - 2006 por OTERO, Javier. (Se agrega control de duplicado ya aprobado)
-- <ACTUALIZACIONES> 28 - 03 - 2006 por FIORUCCI, Adriana y SANES, Jorge. (Se agrega control de duplicado ya aprobado, se agrego control por Servicio)
-- <ACTUALIZACIONES> 11 - 04 - 2006 por SANES, Jorge. (Se agrega GOTO Salir en Controles que generan codigo 3)
-- <ACTUALIZACIONES> 09 - 05 - 2006 por OTERO, Javier. (Se agrega control de antiguedad o posterioridad de movimiento)
-- <ACTUALIZACIONES> 23 - 05 - 2006 por FIORUCCI, Adriana y SANES, Jorge. (Se agrega control contra la Cola de Movimiento para que no existan Licencias Pendientes de Procesar)
-- <ACTUALIZACIONES> 29 - 05 - 2006 por SANES, Jorge. (Se agrega control contra la Cola de Movimiento para que no existan Licencias Pendientes de Procesar - Se actualizo la Ventana y el codigo de error del PA)
-- <ACTUALIZACIONES> 04 - 09 - 2006 por FIORUCCI, Adriana y SANES, Jorge. (En control de Intermedio Obligatorio se cambio signo > por <)
-- <ACTUALIZACIONES> 19 - 10 - 2006 por OTERO, Javier. (Se agrega el control de Antiguedad Maxima y Licencias Relacionadas)
-- <ACTUALIZACIONES> 11 - 12 - 2007 por FIORUCCI Adriana y SANES, Jorge  (Se mejoro el control de Movimientos pendientes para la misma plaza en el mismo momento de registración)
--  <ACTUALIZACIONES> 28-04-2009  OTERO, Marcelo y SANES, Jorge (Se agrego que no se chequee la Licencia de Paro Docente porque no esta la desicion de descontar o no -- 28-04-2009)


-- ACTUALIZADO EN DB
--15/05/2006 - SANES, Jorge
--23/05/2006 - SANES, Jorge
--29/05/2006 - SANES, Jorge
--12/12/2007 - SANES, Jorge

@idCola INT,
@Estado INT OUTPUT,
@Diagnostico VARCHAR(1000) OUTPUT,
@ColasControl VARCHAR(150) 

AS

SET NOCOUNT ON

SET DATEFORMAT dmy

DECLARE @Warning VARCHAR(1000)
DECLARE @Fecha1 DATETIME
DECLARE @Fecha2 DATETIME
DECLARE @SitRev INT
DECLARE @Agente INT
DECLARE @SubServicio INT
DECLARE @Servicio INT
DECLARE @Licencia INT
DECLARE @error INT
DECLARE @DuracionMax INT
DECLARE @dias INT
DECLARE @RequiereEnfermedad VARCHAR(1)
DECLARE @UTDurMax INT
DECLARE @UTAntMin INT
DECLARE @AntMin INT
DECLARE @UTCAntMin INT
DECLARE @INTermedioObligatorio INT
DECLARE @UTINTermedioObligatorio INT
DECLARE @Limite1 INT
DECLARE @Limite2 INT
DECLARE @UTLimite1 INT
DECLARE @UTLimite2 INT
DECLARE @UTCLimite1 INT
DECLARE @UTCLimite2 INT
DECLARE @CantMax INT
DECLARE @UTCCantMax INT
DECLARE @UTC VARCHAR(10)
DECLARE @cod INT
DECLARE @SPEspecIFico VARCHAR(50)
DECLARE @FAlta DATETIME
DECLARE @SitLabAsociada INT
DECLARE @CUPOFDestino INT
DECLARE @FechaTermino DATETIME
DECLARE @FechaAEvaluar DATETIME
DECLARE @DuracionMinima INT
DECLARE @UTDuracionMinima INT
DECLARE @Aplicacion INT
DECLARE @Turno INT
DECLARE @FechaDeLicencia INT
DECLARE @FechaDesde DATETIME
DECLARE @FechaHasta DATETIME
DECLARE @NoControlarAntiguedad BIT
DECLARE @Enfermedad INT
DECLARE @Modo INT
-- Para almacenar el porque se produjo el error por si hay que llamar a una restriccion especifica.
DECLARE @OrigenDelError INT 
-- Para almacenar el nombre del procedimiento de restriccion especifica.
DECLARE @RestriccionEspecifica VARCHAR(255)
DECLARE @Plaza INT
DECLARE @IDServicioAgente INT 

DECLARE @FASA DATETIME
DECLARE @FBSA DATETIME
DECLARE @Causa INT
-- Almacena el parametro para contar la cantidad de dias permitidos para pasar un movimiento posterior.
DECLARE @DiasPosterioresAlta INT
-- Almacena el parametro para contar la cantidad de dias permitidos para pasar un movimiento anterior a la fecha.
DECLARE @DiasAnterioresAlta INT
DECLARE @DiasPosterioresBaja INT
DECLARE @DiasAnterioresBaja INT
DECLARE @AntiguedadMaxima INT
DECLARE @UTAntiguedadMaxima INT
DECLARE @UTCAntiguedadMAxima INT
DECLARE @DiasAcumulados INT 
DECLARE @LicenciaRelacionada INT

SET @Diagnostico = ' '
SET @error = 0
SET @cod = 0
SET @Causa = 0
SET @DiasAcumulados = 0

-- Se extraen los datos de la Cola de Movimientos
SELECT @Fecha1 = Fecha1, @Fecha2 = Fecha2, @Agente = Agente, @Licencia = Licencia, @SitRev = SitRev,  @FechaTermino = FechaTermino 
FROM tb_ColaDeMovimientos WHERE idCola = @idCola

SELECT @SubServicio = servicio, @CUPOFDestino = PlazaDestino, @FechaDeLicencia = FechaDeLicencia, @Enfermedad = Enfermedad 
FROM tb_PlazasDeMovimiento WHERE idCola = @idCola

SELECT @Modo = Modo FROM tb_Usuarios WHERE NTUser = SYSTEM_USER
SELECT @DiasPosterioresAlta = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeAltaPosterior'
SELECT @DiasAnterioresAlta = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeAltaAnteriores'
SELECT @DiasPosterioresBaja = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeBajaPosterior'
SELECT @DiasAnterioresBaja = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeBajaAnteriores'


SELECT @Plaza = Plaza, @IDServicioAgente=ServicioAgente  FROM tb_SubServiciosAgentes WHERE IdSubServicio = @SubServicio


/*
-- Cambio realizado 10-12-2007
-- Control agregado 23/05/2006 y 29/05/2006
-- Verificar que NO exista en la Cola de Movimientos otra Licencia registrada sin Procesar por Personal Docente
IF EXISTS(SELECT top 1 CM.IdCola   FROM Tb_ColaDeMovimientos AS CM   INNER JOIN Tb_PlazasDeMovimiento AS PM ON CM.IdCola=PM.IdCola
	    INNER JOIN  tb_InicioSGITemp ON CM.Organizacion = tb_InicioSGITemp.Organizacion 
  	    WHERE CM.Movimiento=3 AND CM.Estado IN (0,1) AND CM.Agente=@Agente  AND PM.IDPlaza=@Plaza AND CM.IdCola<>@IdCola and   CM.Fecha >=tb_InicioSGITemp.FechaControles)
Begin
   SELECT @Cod = 99, @Diagnostico='* Atención ! Existe otra Licencia para este Agente en este CUPOF pendiente de Aprobar/Procesar por Personal Docente.-.' --+CONVERT(VARCHAR(10),@IdCola)+'/'+CONVERT(VARCHAR(10),@Plaza)
   GOTO Salir
End
*/

-- Control Provisorio para que no registren Licencias de Paro

IF @Licencia = 91
BEGIN
	SELECT @cod = 3, @Diagnostico='* IMPORTANTE! En este momento no se puede registrar la Licencia " Inasistencia por Adhesión a Paro ", se estan realizando cambios en el Sistema. Por favor comunicarce con la Dirección de  Personal Docente para mayor información.'
	GOTO Salir
END

------------------------------------------- FUNCION PARA ANALIZAR Colas Enviadas en el mismo movimiento  11-12-2007 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-- El parametro @ColasControl trae colas para chequear cuando se llama de la pantalla de Concecion de Licencias, si el chequeo se llama de la pantalla de movimientos pendientes no debiera chequear esto.
IF LEN(RTRIM(LTRIM(@ColasControl))) >0
     BEGIN 
	DECLARE @Delimitador CHAR(1)
	
	SET @Delimitador = ','
	
	DECLARE @Item Varchar(200)
	
	CREATE TABLE #ListaColas(Item Varchar(10)) 
	
	WHILE CHARINDEX(@Delimitador,@ColasControl,0) <> 0
		BEGIN
	
			SELECT
				@Item=RTRIM(LTRIM(SUBSTRING(@ColasControl,1,CHARINDEX(@Delimitador,@ColasControl,0)-1))),
				@ColasControl=RTRIM(LTRIM(SUBSTRING(@ColasControl,CHARINDEX(@Delimitador,@ColasControl,0)+1,LEN(@ColasControl))))
			IF LEN(@Item) > 0
				INSERT INTO #ListaColas SELECT @Item
		END
	
	IF LEN(@ColasControl) > 0
		INSERT INTO #ListaColas SELECT @ColasControl 
	
	-- Verificar que NO exista en la Cola de Movimientos otra Licencia registrada sin Procesar por Personal Docente
	IF EXISTS(SELECT TOP 1 CM.IdCola   FROM Tb_ColaDeMovimientos AS CM  
		    INNER JOIN Tb_PlazasDeMovimiento AS PM ON CM.IdCola=PM.IdCola
		    INNER JOIN  tb_InicioSGITemp ON CM.Organizacion = tb_InicioSGITemp.Organizacion 
	  	   	 WHERE CM.Movimiento=3 
			       AND CM.Estado IN (0,1) 
  			       AND CM.Licencia <> 91 --- Se agrego que no se chequee la Licencia de Paro Docente porque no esta la desicion de descontar o no -- 28-04-2009
			       AND CM.Agente=@Agente  
			       AND PM.IDPlaza=@Plaza
			       AND   CM.Fecha >=tb_InicioSGITemp.FechaControles 
			      AND CM.IdCola NOT IN (SELECT Item FROM #ListaColas) )
		BEGIN
			   SELECT @Cod = 99, @Diagnostico='* Atención ! Existe otra Licencia para este Agente en este CUPOF pendiente de Aprobar/Procesar por Personal Docente.-.' 
			   GOTO Salir
		END
	
	
	DROP TABLE #ListaColas
     END
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


-- Verifica que el movimiento no exista -------- VER DEBE CONTROLAR POR PLAZA pero ojo con los Incrementos de Horas, son sobre la misma Plaza - CUPOF
IF EXISTS(SELECT top 1 IdSubServicio FROM tb_SubServiciosAgentes SS INNER JOIN tb_ServiciosAgentes S ON IdServicioAgente = ServicioAgente 
	WHERE S.IdServicioAgente=@IDServicioAgente AND  Agente = @Agente AND SS.FechaAlta = @Fecha1 AND Licencia = @Licencia)
BEGIN
	SELECT @cod = 3, @Diagnostico='* Error! La Licencia que intenta pasar ya fue Aprobada/Procesada por Personal Docente.'
	GOTO salir
END 

-- Verifica que si viene una Fecha de Licencias, las fechas ingresadas esten comprendidas entre esta.
IF @FechaDeLicencia IS NOT NULL
BEGIN
	SELECT @FechaDesde = FechaDesde, @FechaHasta = FechaHasta FROM tb_FechasDeLicencias WHERE IdFechaDeLicencia = @FechaDeLicencia

	IF @Fecha1 < @FechaDesde OR @Fecha2 > @FechaHasta
	BEGIN
		SELECT @cod = 3, @Causa = 1, @Diagnostico='* Error! La fechas que desea ingresar no está dentro del rango válido para la Fecha De Licencia seleccionada.'
		GOTO salir
	END	
END

SELECT @Servicio = ServicioAgente, @FAlta = SS.FechaAlta, @Turno = P.Turno  
FROM tb_SubServiciosAgentes SS
INNER JOIN tb_Plazas P ON IdPlaza = Plaza
WHERE idSubServicio = @SubServicio 

SELECT @SitRev = SituacionRevista, @FASA = FechaAlta, @FBSA = FechaBaja FROM tb_ServiciosAgentes 
WHERE idServicioagente = @Servicio

-- Extraigo los atributos de la licencia
SELECT @DuracionMax = DuracionMaxima, @RequiereEnfermedad = RequiereRegEnfermedad,
@UTDurMax = UTDuracionMaxima, @UTAntMin = UTAntiguedadMinima, @AntMin = AntiguedadMinima, @UTCAntMin = UTCAntiguedadMinima,
@INTermedioObligatorio = INTermedioObligatorio, @UTINTermedioObligatorio = UTINTermOblig, @Limite1 = LimiteDias1, @UTLimite1 = UTLimiteDias1,
@UTCLimite1 = UTCLimiteDias1,  @Limite2 = LimiteDias2, @UTLimite2 = UTLimiteDias2, @UTCLimite2 = UTCLimiteDias2, @CantMax = CantidadMaxPedidos,@UTCCantMax = UTCCantidadMaxPed, @SPEspecIFico = RestriccionEspecIFica, @SitLabAsociada = SituacionLaboralAsociada,
@DuracionMinima = DuracionMinima, @UTDuracionMinima = UTDuracionMinima, @Aplicacion = Aplicacion, @RestriccionEspecifica = RestriccionEspecifica,
@AntiguedadMaxima = AntiguedadMaxima, @UTAntiguedadMaxima = UTAntiguedadMaxima, @UTCAntiguedadMaxima = UTCAntiguedadMaxima
FROM tb_licencias WHERE idLicencia = @Licencia

-- Veo si la licencia se tiene que insertar abierta. Si es asi tomo para evaluar la fecha prevista de termino.
IF @Fecha2 is NOT NULL
	SELECT @FechaAEvaluar = @Fecha2
ELSE
IF @Fecha2 is NULL AND @FechaTermino is NOT NULL
	SELECT @FechaAEvaluar = @FechaTermino
ELSE
	SELECT @FechaAEvaluar = GETDATE()

-- LAS ESCUELAS NO PUEDEN PASAR LICENCIAS EXTRAPRDINARAS
IF @Modo = 2 AND @Licencia IN (SELECT IdLicencia FROM tb_Licencias WHERE SituacionLaboralAsociada = 1)
BEGIN
	SELECT @Cod = 3, @Causa = 2, @Diagnostico = 'Error! El usuario no puede informar Licencias Extraordinarias'
	GOTO salir
END

-- Si no viene el cupof destino
IF @CupofDestino = -1 
	SELECT  @CupofDestino = NULL

IF @fecha1 < @FASA
BEGIN
	SELECT @cod = 3, @Causa = 3, @Diagnostico='* Error! La fecha de alta en la que se quiere insertar la licencia no puede ser anterior a la fecha de alta del servicio!'
	GOTO salir
END

IF @Fecha2 IS NOT NULL AND @FBSA IS NOT NULL AND @Fecha2 > @FBSA
BEGIN
	SELECT @cod = 3, @Causa = 4, @Diagnostico='* Error! La fecha de baja de la licencia es posterior a la fecha de baja del servicio!'
	GOTO salir
END

IF EXISTS(SELECT top 1 IdSubServicio FROM tb_SubServiciosAgentes WHERE ServicioAgente = @Servicio AND FechaBaja = @fecha1 AND Licencia IS NOT NULL)
BEGIN
	SELECT @cod = 3, @Causa = 5, @Diagnostico='* Error! La fecha del movimiento que intenta realizar se superpone con otro subservicio!'
	GOTO salir
END

IF @Fecha1 > @Fecha2
BEGIN
	SELECT @Cod = 3,  @Causa = 6, @Diagnostico = '* Error! La fecha de inicio es mayor a la fecha de fin!'
	GOTO salir
END

-- Verifico si la licencia tiene sit lab LE y no hay cupof destino.
IF @SitLabAsociada = 1 AND @CupofDestino IS NULL	BEGIN
--	prINT 'Error de cupof destino'
	SELECT @Cod = 3, @Causa = 7, @Diagnostico = '*' + 'Esta licencia requiere un CUPOF destino debido a que la situacion laboral es LE!'
	GOTO salir
END

-- Verifico si la licencia tiene sit lab LE y no hay cupof destino.
IF @SitLabAsociada = 1 AND @CupofDestino IS NULL	
BEGIN
--	prINT 'Error de cupof destino'
	SELECT @Cod = 3, @Causa = 8, @Diagnostico = '*' + 'Esta licencia requiere un CUPOF destino debido a que la situacion laboral es LE!'
	GOTO salir
END

-- Si ya existe el movimiento
IF Exists (SELECT top 1 IdSubServicio FROM tb_SubServiciosAgentes WHERE ServicioAgente = @Servicio AND fechaAlta = @Fecha1 AND FechaBaja = @Fecha2 AND Licencia = @Licencia)
BEGIN
	SELECT @Cod = 3, @Causa = 9, @Diagnostico = '*' + 'La Licencia que intenta cargar ya existe!'
	GOTO salir
END

IF @fecha1 < @fasa
BEGIN
	SELECT @cod = 3, @Causa = 10, @Diagnostico=@Diagnostico+'*' + 'Error! La Licencia que intenta insertar esta fuera de un servicio valido. ModIFique la fecha de inicio de la Licencia y vuelva a INTentarlo!'
	GOTO salir
END


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------ ESTO SE QUITO POR SOLICITUD DE ROBERTO, YA QUE LAS ESCUELAS NO DEBEN CARGAR EL CODIGO DE ENFERMEDAD
--		 VerIFico si la licencia requiere un codigo de enfermedad y si fue suministrado
--IF ((@RequiereEnfermedad = 'S') AND (SELECT Enfermedad FROM tb_PlazasDeMovimiento WHERE idCola = @idCola) is NULL)
--BEGIN
--	SELECT @Cod = 1, @Causa = 11, @Diagnostico = '*' + 'Esta licencia requiere un codigo de enfermedad que no ha sido suministrado'
--	GOTO salir
--END
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


IF EXISTS (SELECT top 1 IdSubServicio FROM tb_SubServiciosAgentes WHERE @Fecha1 >= FechaAlta AND Baja = 'S' AND FechaBaja >= @Fecha1 AND ServicioAgente = @Servicio) 
BEGIN
IF @Fecha2 IS NULL
	BEGIN
	SELECT @cod = 3, @Causa = 12, @Diagnostico=@Diagnostico+'*' + 'Error! La Licencia se superpone con un sub servicio ya dado de baja. Para insertar una licencia historica debe especificar una fecha de baja!'
	GOTO Salir  --  Agregadp 11/04/2006
	END

IF @fecha2 IS NOT NULL 
	BEGIN
	     IF NOT EXISTS (SELECT top 1 IdSubServicio FROM tb_SubServiciosAgentes WHERE @Fecha1 >= FechaAlta AND Baja = 'S' AND FechaBaja >= @Fecha2 AND ServicioAgente = @Servicio) 
		BEGIN
		   SELECT @cod=3, @Causa = 13, @Diagnostico=@Diagnostico+'*'+'-Error!. Para insertar una licencia historica ésta debe estar dentro de un subservicio! El alta de la misma involucra a varios'
		   GOTO Salir -- Agregado 11/04/2006
		END
	END	
--UPDATE tb__PlazasDeMovimiento SET estado = 3 WHERE idCola = @idCola
END

--Es una licencia extraordinaria, se especifica CupofDestino pero el CupofDestino esta ocupada por otra persona
IF @SitLabAsociada = 1 AND @CUPOFDestino is NOT NULL AND EXISTS(SELECT top 1 IdSubServicio FROM tb_SubServiciosAgentes s WHERE plaza = @CUPOFdestino AND
	((FechaAlta <= @Fecha1 AND baja = 'N') or (baja = 'S' AND FechaAlta <= @Fecha1 AND FechaBaja >= @Fecha1)))
BEGIN
	--DECLARE @idss INT
	--SELECT @idss = (SELECT max(idsubservicio) FROM tb__SubServiciosAgentes s WHERE plaza = @CUPOFdestino AND
	--((FechaAlta <= @Fecha1 AND baja = 'N') or (baja = 'S' AND FechaAlta <= @Fecha1 AND FechaBaja >= @Fecha1)))
	SELECT @Cod = 1, @Causa = 14, @Diagnostico = '*' + 'La Plaza destino seleccionada ('+(SELECT Cupof FROM tb_Plazas WHERE idPlaza = @CupofDestino)+' esta ocupada por otro agente!'
	GOTO salir
END


-- VerIFica la duracion maxima de la licencia. Si no se especIFica la fecha de baja se agrega un mensaje de alerta
-- Miro si el sub servicio anterior tambien tenia la misma licencia...
DECLARE @F1 DATETIME
SELECT @dias = 0
IF (@FechaAEvaluar is NOT NULL)
	BEGIN
	IF (SELECT Licencia FROM tb_SubServiciosAgentes WHERE idSubServicio = @SubServicio) = @Licencia
	BEGIN
		IF (@UTDurMax = 1)
		BEGIN
			SELECT @F1 = FechaAlta FROM tb_SubServiciosagentes WHERE idSubServicio = @SubServicio
			SELECT @dias = DATEDIFF(DAY, @F1, @Fecha1)
		END
		ELSE
		BEGIN
			SELECT @F1 = FechaAlta FROM tb_SubServiciosAgentes WHERE idSubServicio = @SubServicio
			EXEC @dias = spDIFDiasHabiles @Fecha1, @FechaAEvaluar
		END
	END		

	-- Agregado el 02-03-2006 (Javier Otero) Para controlar si una licencia de dias corridos termina un viernes y continua un lunes.
	IF DATENAME(WEEKDAY, @Fecha1) = 'Lunes' 
		AND EXISTS(SELECT top 1  IdSubServicio FROM tb_SubServiciosAgentes WHERE ServicioAgente = @Servicio AND FechaBaja = DATEADD(DAY, -2, @Fecha1) AND Licencia = @Licencia)  
		AND @UTDurMax = 1
	BEGIN
		SELECT @F1 = FechaAlta FROM tb_SubServiciosAgentes WHERE ServicioAgente = @Servicio AND FechaBaja = DATEADD(DAY, -2, @Fecha1) AND Licencia = @Licencia
		-- Suma el sabado y el domingo
		SELECT @dias = 2
	END

	IF (@UTDurMax = 1)
		SELECT @dias = @dias+DATEDIFF(DAY, @Fecha1, @FechaAEvaluar)
	ELSE
	BEGIN
		DECLARE @dias2 INT
		EXEC @dias2 = spDIFDiasHabiles @Fecha1, @FechaaEvaluar
		SELECT @Dias = @dias + @dias2
	END

	IF @dias > @DuracionMax
	BEGIN
		SELECT @cod = 1, @Causa = 15, @Diagnostico= '*' + 'Se supera el total de dias ('+convert(VARCHAR, @duracionmax)+') permitidos por esta licencia'
		GOTO salir		
	END
END
ELSE
	SELECT @Warning = 'No se especifico la fecha de baja de la Licencia. La fecha de plazo maxima es '+convert(VARCHAR,dateadd(day, @DuracionMax, @Fecha1))
	
--Verifico la duracion minima de la licencia
SELECT @dias = 0
IF (@FechaAEvaluar is NOT NULL) AND (@DuracionMinima is NOT NULL)
	BEGIN
	IF (SELECT Licencia FROM tb_SubServiciosAgentes WHERE idSubServicio = @SubServicio) = @Licencia
		BEGIN
		IF (@UTDuracionMinima = 1)
			BEGIN
			SELECT @F1 = FechaAlta FROM tb_SubServicios WHERE idSubServicio = @SubServicio
			SELECT @dias = datedIFf(day, @F1, @Fecha1)
			END
		ELSE
			BEGIN
			SELECT @F1 = FechaAlta FROM tb_SubServicios WHERE idSubServicio = @SubServicio
			EXEC @dias = spDIFDiasHabiles @Fecha1, @FechaAEvaluar
			END
		END		
	IF (@UTDuracionMinima = 1)
		SELECT @dias = @dias+datedIFf(day, @Fecha1, @FechaAEvaluar)
	ELSE
		BEGIN
		EXEC @dias2 = spDIFDiasHabiles @Fecha1, @FechaaEvaluar
		SELECT @Dias = @dias + @dias2
		END

	IF @dias < @duracionminima
		BEGIN
		SELECT @cod = 1, @Causa = 16, @Diagnostico= '*' + 'Esta licencia necesita como mínimo ('+convert(VARCHAR, @duracionminima)+') dias y se tomaría '+convert(VARCHAR, @dias)
		GOTO salir				END
	END
ELSE
	SELECT @Warning = 'No se especIFico la fecha de baja de la Licencia. La fecha de plazo maxima es '+convert(VARCHAR,dateadd(day, @DuracionMax, @Fecha1))


-- Verifico la antiguedad minima que permite la licencia teniENDo en cuenta la UT y la UTC
DECLARE @antiguedad INT
DECLARE @fecha datetime
-- En el Año
IF @UTCAntMin = 1
	BEGIN
		SELECT @fecha = cast('01/01/'+cast(year(@Fecha1) as VARCHAR(4)) as datetime)
	END
-- En el año de servicio?
IF @UTCAntMin = 2
	BEGIN
		SELECT @fecha  = dateadd(day, -365, @Fecha1)
	END
-- en Total
IF @UTCAntMin = 6
	SELECT @fecha = min(FechaAlta) FROM tb_ServiciosAgentes WHERE Agente = @Agente group by Agente
-- En el Decenio
IF @UTCAntMin = 5
	BEGIN
		SELECT @fecha='01/01/'+convert(VARCHAR,datepart(year,@Fecha1)-9)
	END
-- En el Bieño
IF @UTCAntMin = 4
	BEGIN
		SELECT @fecha = '01/01/'+convert(VARCHAR, year(@Fecha1)-1)
	END
-- En el mes calENDario
IF @UTCAntMin = 3
	BEGIN
		SELECT @fecha='01/'+convert(VARCHAR,datepart(month,@Fecha1))+convert(VARCHAR,datepart(year,@Fecha1))
	END
--Si la antiguedad se mide en dias Corridos
IF @UTAntMin  = 1
	BEGIN
		EXEC spAntiguedadAgente @Agente, @fecha, @Fecha1, @antiguedad output
	END
ELSE
		EXEC spAntiguedadAgenteHab @Agente, @fecha, @Fecha1, @antiguedad output
IF @AntMin > @Antiguedad AND ( (@Enfermedad IS NULL) OR (@Enfermedad IS NOT NULL AND @Enfermedad NOT IN (SELECT IdEnfermedad FROM tb_Enfermedades WHERE NoCuentaAntiguedadParaLicencia = 'S')))
BEGIN
	SELECT @cod = 1, @Causa = 17, @Diagnostico ='*'+'El agente tiene '+convert(VARCHAR, @antiguedad)+' dias de servicio. Para gozar la licencia se necesitan mas de '+convert(VARCHAR, @AntMin)	
	GOTO SALIR
END

-- Cheque de Antiguedad Maxima. Agregado el 10-10-2006
IF @AntiguedadMaxima IS NOT NULL
BEGIN
	-- En el Año
	IF @UTCAntiguedadMaxima = 1
	BEGIN
		SELECT @fecha = CAST('01/01/'+CAST(YEAR(@Fecha1) AS VARCHAR(4)) AS DATETIME)
	END
	-- En el año de servicio?
	IF @UTCAntiguedadMaxima = 2
	BEGIN
		SELECT @fecha  = DATEADD(DAY, -365, @Fecha1)
	END
	-- en Total
	IF @UTCAntiguedadMaxima = 6
		SELECT @fecha = MIN(FechaAlta) FROM tb_ServiciosAgentes WHERE Agente = @Agente group by Agente
	-- En el Decenio
	IF @UTCAntiguedadMaxima = 5
	BEGIN
		SELECT @fecha='01/01/'+CONVERT(VARCHAR,DATEPART(YEAR,@Fecha1)-9)
	END
	-- En el Bieño
	IF @UTCAntiguedadMaxima = 4
	BEGIN
		SELECT @fecha = '01/01/'+CONVERT(VARCHAR, YEAR(@Fecha1)-1)
	END
	-- En el mes calENDario
	IF @UTCAntiguedadMaxima = 3
	BEGIN
		SELECT @fecha='01/'+CONVERT(VARCHAR,DATEPART(MONTH,@Fecha1))+CONVERT(VARCHAR,DATEPART(YEAR,@Fecha1))
	END
	--Si la antiguedad se mide en dias Corridos
	IF @UTAntiguedadMaxima  = 1
		EXEC spAntiguedadAgente @Agente, @fecha, @Fecha1, @antiguedad OUTPUT
	ELSE
		EXEC spAntiguedadAgenteHab @Agente, @fecha, @Fecha1, @antiguedad OUTPUT
	IF @AntiguedadMaxima < @Antiguedad AND ( (@Enfermedad IS NULL) OR (@Enfermedad IS NOT NULL AND @Enfermedad NOT IN (SELECT IdEnfermedad FROM tb_Enfermedades WHERE NoCuentaAntiguedadParaLicencia = 'S')))
	BEGIN
		SELECT @cod = 1, @Causa = 17, @Diagnostico ='*'+'El agente tiene '+CONVERT(VARCHAR, @antiguedad)+' dias de servicio. Para gozar la licencia se necesitan MENOS de '+CONVERT(VARCHAR, @AntiguedadMaxima)	
		GOTO SALIR
	END
END -- END Cheque Antiguedad Maxima

-- controlo la distancia minima entre licencias (INTERMEDIO OBLIGATORIO)
-- Si el subservicio anterior no esta dado de baja y es el mismo tipo de licencia?
DECLARE @MayorFB datetime
IF (@INTermedioObligatorio is NOT NULL) or (@INTermedioObligatorio > 0)
	BEGIN
	IF (SELECT FechaBaja FROM tb_SubServiciosAgentes WHERE idsubServicio = @SubServicio) is NULL AND (SELECT Licencia FROM tb_SubServiciosAgentes WHERE idSubServicio = @SubServicio) = @Licencia
		BEGIN
		SELECT @cod = 1,@Diagnostico = '*'+'El Agente tiene esa Licencia y sin baja!. No cumple con la cantidad de dias minima entre licencias'
		GOTO salir
		END
	ELSE
		BEGIN
		SELECT @MayorFB = max(ss.FechaBaja) FROM tb_SubServiciosAgentes ss, tb_ServiciosAgentes s WHERE s.agente = @Agente AND s.idServicioAgente = ss.servicioAgente AND ss.Licencia = @Licencia
		IF @UTINTermedioObligatorio = 1
			SELECT @dias = datedIFf(day, @MayorFB, @Fecha1)
		ELSE
			EXEC @dias = spDIFDiasHabiles @MayorFB, @Fecha1
		IF @dias < @INTermedioObligatorio
			BEGIN			SELECT @cod = 1, @Causa = 18, @Diagnostico = '*'+'El Agente tuvo esa licencia el dia '+convert(VARCHAR, @MayorFB)+'. No cumple con la cantidad de dias minima entre licencias' 
			GOTO salir
			END
		END
	END

-- VerIFico el primer limite de dias
DECLARE @dias1 INT
IF (@Limite1 is NOT NULL) or (@Limite1 <> 9999) AND (@FechaAEvaluar is NOT NULL)
-- Primero calculo la dIFerencia de la licencia que se quiere insertar
BEGIN
IF @UTLimite1 = 1
	SELECT @dias1 = DATEDIFF(day, @Fecha1, @FechaAEvaluar)+1
ELSE
	EXEC @dias1 = spDIFDiasHabiles @Fecha1, @FechaAEvaluar

select @dias1 as dias1

--En el año
IF @UTCLimite1 = 1
	SELECT @fecha = '01/01/'+convert(VARCHAR, year(@Fecha1)), @UTC = ' año '

--En el año de servicio ==> ESTA PENDIENTE
IF @UTCLimite1 = 2
	SELECT @fecha = '01/01/'+convert(VARCHAR, year(@Fecha1)), @UTC = ' año de servicio '

--En el mes calENDario
IF @UTCLimite1 = 3
	SELECT @fecha = '01/'+convert(VARCHAR, month(@Fecha1))+'/'+convert(VARCHAR, year(@Fecha1)), @UTC = ' mes '

-- En el bieño
IF @UTCLimite1 = 4
	SELECT @fecha = '01/01/'+convert(VARCHAR,year(@Fecha1)-1), @UTC = ' bieño '

-- En el decenio calENDario
IF @UTCLimite1 = 5
	SELECT @fecha = '01/01/'+convert(VARCHAR,year(@Fecha1)-9), @UTC = ' decenio '

-- En el Total
IF @UTCLimite1 = 6
	BEGIN
	SELECT @fecha = min(FechaAlta) FROM tb_ServiciosAgentes WHERE Agente = @Agente
	SELECT @UTC = ' total '
	END

SELECT @dias = 0

IF @UTLimite1 = 1
	EXEC @dias = spDiasDeLicencias @Agente, @fecha, @fecha1, @licencia,'C', @Aplicacion, @Turno
ELSE
BEGIN
	EXEC @dias = spDiasDeLicencias @Agente, @fecha, @fecha1, @licencia,'H', @Aplicacion, @Turno
END

--Si la licencia tiene licencias relacionadas del tipo SUMAR DIAS.
IF EXISTS(SELECT top 1 LicenciaRelacionada FROM tb_LicenciasRelacionadas WHERE Licencia = @Licencia AND TipoDeRelacion = 1 AND FechaDeBaja IS NULL)
BEGIN
	SELECT @DiasAcumulados = 0

	DECLARE crsLicenciasRelacionadas CURSOR FORWARD_ONLY  READ_ONLY FOR
	SELECT LicenciaRelacionada FROM tb_LicenciasRelacionadas WHERE Licencia = @Licencia AND TipoDeRelacion = 1 AND FechaDeBaja IS NULL

	OPEN crsLicenciasRelacionadas

	FETCH NEXT FROM crsLicenciasRelacionadas INTO @LicenciaRelacionada

	WHILE @@FETCH_STATUS = 0
	BEGIN
		IF @UTLimite1 = 1
			EXEC @DiasAcumulados = spDiasDeLicencias @Agente, @fecha, @fecha1, @LicenciaRelacionada,'C', @Aplicacion, @Turno
		ELSE
			EXEC @DiasAcumulados = spDiasDeLicencias @Agente, @fecha, @fecha1, @LicenciaRelacionada,'H', @Aplicacion, @Turno
	
		FETCH NEXT FROM crsLicenciasRelacionadas INTO @LicenciaRelacionada
	END

	CLOSE crsLicenciasRelacionadas
	DEALLOCATE crsLicenciasRelacionadas
END
SELECT @dias as dias
SELECT @dias = @dias+@dias1+@DiasAcumulados

IF @dias > @Limite1
	BEGIN
	SELECT @cod = 1, @Causa = 19, @Diagnostico = '*Error! El agente se tomaría '+convert(VARCHAR, @dias)+' días en el último '+@UTC+'y no se puede tomar  mas de '+convert(VARCHAR,@Limite1)+' en el periodo'
	GOTO salir
	END 
END

-- Verifico el segundo limite de dias
IF (@Limite2 is NOT NULL) or (@Limite2 <> 9999) AND (@FechaAEvaluar is NOT NULL)
-- Primero calculo la dIFerencia de la licencia que se quiere insertar
BEGIN
SELECT @Dias = 0, @Dias2 = 0IF @UTLimite2 = 1
	SELECT @dias2 = DATEDIFF(day, @Fecha1, @FechaAEvaluar)+1
ELSE
	EXEC @dias2 = spDIFDiasHabiles @Fecha1, @FechaAEvaluar


IF @Fecha1 = @FechaAEvaluar 
	SELECT @dias2 = 1

--En el año
IF @UTCLimite2 = 1
	BEGIN
	SELECT @fecha = '1/1/'+convert(VARCHAR, year(@Fecha1)), @UTC = ' año '
	END
--En el año de servicio (PENDIENTE)
IF @UTCLimite2 = 2
	SELECT @fecha = '1/1/'+convert(VARCHAR, year(@Fecha1)), @UTC = ' año de servicio '

--En el mes calENDario
IF @UTCLimite2 = 3
	BEGIN
	SELECT @fecha = +'01/'+convert(VARCHAR, month(@Fecha1))+'/'+convert(VARCHAR, year(@Fecha1)), @UTC = ' mes '
	END
-- En el bieño
IF @UTCLimite2 = 4
	BEGIN
	SELECT @fecha = '01/01/'+convert(VARCHAR,year(@Fecha1)-1), @UTC = ' bieño '
	END
-- En el decenio calENDario
IF @UTCLimite2 = 5
	BEGIN
	SELECT @fecha = '1/1/'+convert(VARCHAR,year(@Fecha1)-9), @UTC = ' decenio '
	END

-- En el Total
IF @UTCLimite2 = 6
	BEGIN
	SELECT @fecha = min(FechaAlta) FROM tb_ServiciosAgentes WHERE Agente = @Agente
	SELECT @UTC = ' total '
	END
IF @UTLimite2 = 1
BEGIN
	SET dateformat dmy
	EXEC @dias = spDiasDeLicencias @Agente, @fecha, @fecha1, @Licencia, 'C', @Aplicacion, @Turno
END
ELSE
BEGIN
	DECLARE @FD smalldatetime
	DECLARE @FH smalldatetime
	SELECT @FD = convert(datetime, @Fecha)
	SELECT @FH = convert(datetime, @Fecha1)

	EXEC @dias = spDiasDeLicencias @Agente, @fd, @fh, @licencia ,'H', @Aplicacion, @Turno

END

--Si la licencia tiene licencias relacionadas del tipo SUMAR DIAS.
SELECT @DiasAcumulados = 0
IF EXISTS(SELECT top 1  LicenciaRelacionada FROM tb_LicenciasRelacionadas WHERE Licencia = @Licencia AND TipoDeRelacion = 1 AND FechaDeBaja IS NULL)
BEGIN
	DECLARE crsLicenciasRelacionadas CURSOR FORWARD_ONLY  READ_ONLY FOR
	SELECT LicenciaRelacionada FROM tb_LicenciasRelacionadas WHERE Licencia = @Licencia AND TipoDeRelacion = 1 AND FechaDeBaja IS NULL

	OPEN crsLicenciasRelacionadas

	FETCH NEXT FROM crsLicenciasRelacionadas INTO @LicenciaRelacionada

	WHILE @@FETCH_STATUS = 0
	BEGIN
		IF @UTLimite1 = 1
			EXEC @DiasAcumulados = spDiasDeLicencias @Agente, @fecha, @fecha1, @LicenciaRelacionada,'C', @Aplicacion, @Turno
		ELSE
			EXEC @DiasAcumulados = spDiasDeLicencias @Agente, @fecha, @fecha1, @LicenciaRelacionada,'H', @Aplicacion, @Turno
	
		FETCH NEXT FROM crsLicenciasRelacionadas INTO @LicenciaRelacionada
	END

	CLOSE crsLicenciasRelacionadas
	DEALLOCATE crsLicenciasRelacionadas
END

SELECT @dias = @dias+@dias2+@DiasAcumulados 

IF @dias > @Limite2
	BEGIN
	SELECT @cod = 1, @Causa = 20, @Diagnostico = '*Error! El agente se tomaría '+convert(VARCHAR, @dias)+' días en el último '+convert(VARCHAR,@UTC)+'y no se puede tomar  mas de '+convert(VARCHAR,@Limite2)+' en el periodo.' -- +' Dias: '+convert(VARCHAR, @Dias)+' Limite2: '+convert(VARCHAR,@Limite2)+ ' Fecha: '+convert(VARCHAR, @FH)+' Fecha1: '+convert(VARCHAR, @FD)+' Agente: '+convert(VARCHAR,@Agente)+' Turno: '+convert(VARCHAR, @Turno)+' Aplicacion '+convert(VARCHAR, @Aplicacion)+' UTLimite2: '+convert(VARCHAR, @UTLimite2)+ ' FechaAEvaluar: '+convert(VARCHAR, @FechaAEvaluar)+' Licencia '+convert(VARCHAR, @licencia)
	GOTO salir
	END
END

-- Verifico el limite de veces de pedido de licencia por UTC.
IF (@CantMax is NOT NULL) or (@CantMax > 0)
BEGIN
	DECLARE @count INT
	
	--En el año
	IF @UTCCantMax = 1
		SELECT @fecha = '1/1/'+convert(VARCHAR, year(@Fecha1)), @UTC = ' año '
	
	--En el año de servicio ==> ESTA PENDIENTE
	IF @UTCCantMax = 2
		SELECT @fecha = '1/1/'+convert(VARCHAR, year(@Fecha1)), @UTC = ' año de servicio '
	
	--En el mes calENDario	
	IF @UTCCantMax = 3
		SELECT @fecha = '1/'+convert(VARCHAR, month(@Fecha1))+'/'+convert(VARCHAR, year(@Fecha1)), @UTC = ' mes '
	
	-- En el bieño
	IF @UTCCantMax = 4
		SELECT @fecha = '1/1/'+convert(VARCHAR,year(@Fecha1)-1), @UTC = ' bieño '
	
	-- En el decenio calENDario
	IF @UTCCantMax = 5
		SELECT @fecha = '1/1/'+convert(VARCHAR,year(@Fecha1)-9), @UTC = ' decenio '
	
	-- En el Total
	IF @UTCCantMax = 6
		BEGIN
		SELECT @fecha = MIN(FechaAlta) FROM tb_ServiciosAgentes WHERE Agente = @Agente
		SELECT @UTC = ' total '
		END
	
	IF @aplicacion = 1 
		SELECT @count = (SELECT count(*)+1 FROM tb_SubServiciosAgentes WHERE FechaAlta > @fecha AND Licencia = @Licencia AND ServicioAgente = @servicio)
	IF @aplicacion = 2
		SELECT @count = (SELECT count(*)+1 FROM tb_SubServiciosAgentes ss INNER JOIN tb_Plazas p on p.IdPlaza = ss.Plaza INNER JOIN tb_ServiciosAgentes s ON s.IdServicioAgente = ss.ServicioAgente WHERE ss.FechaAlta > @fecha AND ss.Licencia = @Licencia AND P.Turno = @turno AND s.Agente = @Agente)
	IF @aplicacion = 3 
		SELECT @count = (SELECT count(*)+1 FROM tb_SubServiciosAgentes ss INNER JOIN tb_ServiciosAgentes s ON s.IdServicioAgente = ss.ServicioAgente WHERE ss.FechaAlta > @fecha AND Licencia = @Licencia AND S.Agente = @agente)
	
	IF (@count > @CantMax)
	BEGIN
		SELECT @cod = 1, @Causa = 21, @Diagnostico = '*Error! El agente se tomaria '+convert(VARCHAR, @count)+' veces esa licencia en el '+@UTC+'y no puede exeder los '+convert(VARCHAR,@CantMax)+' dias'
		GOTO salir
	END
	
END

-- Se verIFica que no se superponga con otro sub servicio anterior dentro del servicio.
-- Si la licencia a insertar esta dentro de un subservicio se toma como correcta
/*
IF exists (SELECT * FROM tb__SubServiciosAgentes WHERE @Fecha1 > FechaAlta AND Baja = 'S' AND FechaBaja > @Fecha1 AND ServicioAgente = @Servicio) 
BEGIN
IF @Fecha2 is NULL
	BEGIN
	prINT 'Error de superposicion'
	SELECT @cod = 3, @Diagnostico='*' + 'Error! La Licencia se superpone con un sub servicio ya dado de baja. Para insertar una licencia historica debe especIFicar una fecha de baja!'
	goto salir
	END
IF @fecha2 is NOT NULL 
	BEGIN
	IF NOT exists (SELECT * FROM tb__SubServiciosAgentes WHERE @Fecha1 >= FechaAlta AND Baja = 'S' AND FechaBaja >= @Fecha2 AND ServicioAgente = @Servicio) 
		BEGIN
		prINT 'Error de superposicion2'
		SELECT @cod=3, @Diagnostico='*'+'-Error!. Para insertar una licencia historica ésta debe estar dentro de un subservicio! El alta de la misma involucra a varios'
		goto salir
		END
	END	
--UPDATE tb__PlazasDeMovimiento SET estado = 3 WHERE idCola = @idCola
END
--else
--	UPDATE tb__PlazasDeMovimiento SET estado = 2 WHERE idCola = @idCola

*/

-- Verifico  Si la Situacion de Revista es valida para esta licencia
IF @SitRev NOT in (SELECT idSituacionRevista FROM tb_SituacionesRevistaPermitidasPorLicencia WHERE idLicencia = @Licencia)
BEGIN
	SELECT @cod = 1, @Causa = 22, @Diagnostico = '*'+'Error! La situacion de revista no es aceptada por este tipo de licencia!'
	GOTO salir
END

-- Se controla que el movimiento no sea demasiado alejado a la fecha del dia.
IF @Fecha1 < GETDATE() AND (DATEDIFF(DAY, @Fecha1, GETDATE())+1) > @DiasAnterioresAlta
	SELECT @Cod = 1, @Diagnostico = 'Error! El movimiento que se desea pasar es demasiado antiguo (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresAlta)+' dias).'
ELSE
	IF  (DATEDIFF(DAY, GETDATE(), @Fecha1)+1) > @DiasPosterioresAlta
		SELECT @Cod = 1, @Diagnostico = 'Error! El movimiento que se desea pasar tiene mas de '+CONVERT(VARCHAR, @DiasPosterioresAlta)+' dias posteriores a la fecha'

IF @Fecha2 IS NOT NULL AND @Fecha2 < GETDATE() AND (DATEDIFF(DAY, @Fecha2, GETDATE())+1) > @DiasAnterioresBaja
	SELECT @Cod = 1, @Diagnostico = 'Error! La fecha de baja exede la cantidad de dias permitidos anteriores a la fecha de hoy (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresAlta)+' dias de diferencia).'
ELSE
	IF @Fecha2 IS NOT NULL AND @Fecha2 > GETDATE() AND (DATEDIFF(DAY, GETDATE(), @Fecha2)+1) > @DiasPosterioresBaja
		SELECT @Cod = 1, @Diagnostico = 'Error! La fecha de baja exede la cantidad de dias permitidos posteriores a la fecha de hoy (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresAlta)+' dias de diferencia).'


Salir:

-- Si el procedimiento tiene una restriccion especifica.
IF @RestriccionEspecifica IS NOT NULL
BEGIN
	DECLARE @proc NVARCHAR(255)
	DECLARE @param NVARCHAR(255)

	SELECT @proc = 'EXECUTE ' + @RestriccionEspecifica + ' @IdCola, @Causa, @Cod OUTPUT, @Diagnostico OUTPUT'
	SELECT @param =  '@IdCola INT, @Causa INT, @Cod INT OUTPUT, @Diagnostico VARCHAR(1000) OUTPUT'

	EXEC sp_ExecuteSQL @proc, @param, @IdCola, @Causa, @Cod OUTPUT, @Diagnostico OUTPUT
END

-- En funcion del codigo (0,1,2) realizo un UPDATE en el estado de la cola y siempre retorno el diagnostico.
UPDATE Tb_ColaDeMovimientos SET Estado = @Cod, estadocheck = @cod,
	 ChequeoEscuela = CASE WHEN @Modo = 2 THEN @Diagnostico ELSE ChequeoEscuela END
	 WHERE idCola = @idCola

SET @Estado = @Cod
GO
